﻿package com.zouloux.core.navigation 
{
	import com.zouloux.core.data.IDataItem;
	import com.zouloux.core.IExecutable;
	
	/**
	 * ...
	 * @author ZoulouX
	 */
	public class MenuItem implements IExecutable, IDataItem
	{
		/**
		 * Le titre du bouton
		 */
		protected var _name			:String			= "";
		
		/**
		 * La vue à ouvrir
		 */
		protected var _view			:String			= "";
		
		/**
		 * L'action à appeler
		 */
		protected var _action		:String			= "index";
		
		/**
		 * Les variable
		 */
		protected var _vars			:Object			=  {};
		
		/**
		 * Une instance au bootstrap
		 */
		protected var _bootstrap	:Bootstrap;
		
		/**
		 * D'autres infos en vrac
		 */
		protected var _attributes	:Object			= {};
		
		/**
		 * Le nom de l'item
		 */
		public function get name():String { return _name; }
		public function set name(value:String):void 
		{
			_name = value;
		}
		
		/**
		 * Le nom de à charger
		 */
		public function get view():String { return _view; }
		public function set view(value:String):void 
		{
			_view = value;
		}
		
		/**
		 * Le nom de l'action associée
		 */
		public function get action():String { return _action; }
		public function set action(value:String):void 
		{
			_action = value;
		}
		
		/**
		 * Les variables associées à l'action
		 */
		public function get vars():Object { return _vars; }
		
		/**
		 * Récupérer les attributs optionnels
		 */
		public function get attributes():Object { return _attributes; }
		
		/**
		 * MenuItem, permet de définir le comportement d'un élément de menu
		 * @param	pXmlNode
		 */
		public function MenuItem (pBootstrapInstance:Bootstrap, pXmlNode:XML)
		{
			// Enregistrer l'instance du bootstrap
			_bootstrap = pBootstrapInstance;
			
			// Vérifier qu'il y ai un nom
			if (pXmlNode.@name.toString() != "" && pXmlNode.@view.toString() != "")
			{
				// Récupérer le nom
				_name = pXmlNode.@name.toString();
				
				// Récupérer la vue cible
				if (pXmlNode.@view.toString() != "")
					_view = pXmlNode.@view.toString();
				
				// Parser l'action
				if (pXmlNode.@action.toString() != "")
					_action = pXmlNode.@action.toString();
				
				var attributeName:String;
				
				// On parse les variables
				for each (var attribute:XML in pXmlNode.attributes() as XMLList)
				{
					// Récupérer le nom de l'attribut
					attributeName = attribute.name().toString() as String;
					
					// On check si c'est pas un param obligatoire
					if (attributeName != "view" && attributeName != "action" && attributeName != "name")
						_vars[attributeName] = attribute.toString();
				}
				
				// Si l'élément à des enfants
				if (pXmlNode.hasComplexContent())
				{
					// Parser toutes les options
					for each (var child:XML in pXmlNode.elements() as XMLList)
					{
						// Récupérer les values
						if (child.@value != null && child.@value != "")
							attributes[child.name()] = child.@value.toString();
					}
				}
			}
			else throw new Error("Unvalid MenuItem (must have @name and @view)");
		}
		
		/**
		 * Exécuter cette action
		 */
		public function execute ():void
		{
			// Appeler la vue associée
			_bootstrap.open(_view, _action, _vars);
		}
		
		/**
		 * ToString
		 */
		public function toString ():String
		{
			return "MenuItem{name:" + _name + ",view:" + _view + ",action:" + _action + ",vars:" + _vars + "}";
		}
	}
}